package cn.layou.thread;

/**
 * 该例子可能导致线程的可见性和有序性问题
 *
 * @author layou
 * @date 2021-04-16
 **/
public class T03_ThreadNoVisibilityAndOrdering {
    private static boolean  ready = false;
    private static int number;

    private static class MyThread extends Thread {
        @Override
        public void run() {
            while(!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        /**
         * 该程序有两个问题
         * 1. ready可能会导致线程可见性，但会有很多可能会导致主动同步ready值
         * 2. number输出可能为0，因为两个赋值语句可能会交换位置
         */
        Thread t = new MyThread();
        t.start();
        number = 42;
        ready = true;
        t.join();
    }
}
